home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / dvi / dvipssrc.zoo / resident.c < prev    next >
C/C++ Source or Header  |  1991-01-20  |  19KB  |  741 lines

  1. /*
  2.  *   This code reads in and handles the defaults for the program from the
  3.  *   file config.sw.  This entire file is a bit kludgy, sorry.
  4.  */
  5. #include "structures.h" /* The copyright notice in that file is included too! */
  6. #include "paths.h"
  7. /*
  8.  *   This is the structure definition for resident fonts.  We use
  9.  *   a small and simple hash table to handle these.  We don't need
  10.  *   a big hash table.
  11.  */
  12. struct resfont *reshash[RESHASHPRIME] ;
  13. /*
  14.  *   These are the external routines we use.
  15.  */
  16. extern void error() ;
  17. extern integer scalewidth() ;
  18. extern void tfmload() ;
  19. extern FILE *search() ;
  20. extern shalfword pkbyte() ;
  21. extern integer pkquad() ;
  22. extern integer pktrio() ;
  23. extern Boolean pkopen() ;
  24. extern char *strcpy() ;
  25. extern char *getenv() ;
  26. extern char *newstring() ;
  27. extern int add_header() ;
  28. extern int add_name() ;
  29. extern char *get_name() ;
  30. extern int system() ;
  31. /*
  32.  *   These are the external variables we use.
  33.  */
  34. #ifdef DEBUG
  35. extern integer debug_flag;
  36. #endif  /* DEBUG */
  37. extern long bytesleft ;
  38. extern quarterword *raster ;
  39. extern FILE *pkfile ;
  40. extern char *oname ;
  41. extern integer swmem, fontmem ;
  42. extern char *tfmpath ;
  43. extern char *pkpath ;
  44. extern char *vfpath ;
  45. extern char *figpath ;
  46. extern char *configpath ;
  47. #ifdef SEARCH_SUBDIRECTORIES
  48. extern char *fontsubdirpath ;
  49. #endif
  50. #ifdef FONTLIB
  51. extern char *flipath, *fliname ;
  52. #endif
  53. extern char *headerpath ;
  54. extern char *paperfmt ; 
  55. extern char *nextstring ;
  56. extern char *maxstring ;
  57. extern char *warningmsg ;
  58. extern Boolean disablecomments ;
  59. extern Boolean compressed ;
  60. extern int quiet ;
  61. extern int filter ;
  62. extern Boolean reverse ;
  63. extern Boolean usesPSfonts ;
  64. extern Boolean nosmallchars ;
  65. extern Boolean removecomments ;
  66. extern Boolean safetyenclose ;
  67. extern int actualdpi ;
  68. extern int vactualdpi ;
  69. extern int maxdrift ;
  70. extern int vmaxdrift ;
  71. extern char *printer ;
  72. extern char *mfmode ;
  73. extern int lastresortsizes[] ;
  74. /*
  75.  *   To maintain a list of document fonts, we use the following
  76.  *   pointer.
  77.  */
  78. struct header_list *ps_fonts_used ;
  79. /*
  80.  *   We use malloc here.
  81.  */
  82. char *malloc() ;
  83. /*
  84.  *   Our hash routine.
  85.  */
  86. int
  87. hash(s)
  88.    char *s ;
  89. {
  90.    int h = 12 ;
  91.  
  92.    while (*s != 0)
  93.       h = (h + h + *s++) % RESHASHPRIME ;
  94.    return(h) ;
  95. }
  96. /*
  97.  *   cleanres() marks all resident fonts as not being yet sent.
  98.  */
  99. void
  100. cleanres() {
  101.    register int i ;
  102.    register struct resfont *p ;
  103.    for (i=0; i<RESHASHPRIME; i++)
  104.       for (p=reshash[i]; p; p=p->next)
  105.          p->sent = 0 ;
  106. }
  107. /*
  108.  *   The routine that looks up a font name.
  109.  */
  110. struct resfont *
  111. lookup(name)
  112.    char *name ;
  113. {
  114.    struct resfont *p ;
  115.  
  116.    for (p=reshash[hash(name)]; p!=NULL; p=p->next)
  117.       if (strcmp(p->Keyname, name)==0)
  118.          return(p) ;
  119.    return(NULL) ;
  120. }
  121. /*
  122.  *   This routine adds an entry.
  123.  */
  124. void
  125. add_entry(Keyname, TeXname, PSname, specinfo, downloadinfo)
  126.    char *Keyname, *TeXname, *PSname, *specinfo, *downloadinfo ;
  127. {
  128.    struct resfont *p ;
  129.    int h ;
  130.  
  131.    if (PSname == NULL)
  132.       PSname = TeXname ;
  133.    else if (strcmp(PSname, TeXname) && Keyname != PSname)
  134.       add_entry(PSname, TeXname, PSname, specinfo, downloadinfo) ;
  135.    p = (struct resfont *)malloc((unsigned int)sizeof(struct resfont)) ;
  136.    if (p==NULL)
  137.       error("! out of memory") ;
  138.    p->Keyname = Keyname ;
  139.    p->PSname = PSname ;
  140.    p->TeXname = TeXname ;
  141.    p->specialinstructions = specinfo ;
  142.    p->downloadheader = downloadinfo ;
  143.    h = hash(Keyname) ;
  144.    p->next = reshash[h] ;
  145.    p->sent = 0 ;
  146.    reshash[h] = p ;
  147. }
  148. /*
  149.  *   Now our residentfont routine.
  150.  */
  151. Boolean
  152. residentfont(curfnt)
  153.         register fontdesctype *curfnt ;
  154. {
  155.    register shalfword i ;
  156.    struct resfont *p ;
  157.  
  158. /*
  159.  *   First we determine if we can find this font in the resident list.
  160.  */
  161.    if (*curfnt->area)
  162.       return 0 ; /* resident fonts never have a nonstandard font area */
  163.    if ((p=lookup(curfnt->name))==NULL)
  164.       return 0 ;
  165. /*
  166.  *   We clear out some pointers:
  167.  */
  168. #ifdef DEBUG
  169.    if (dd(D_FONTS))
  170.         (void)fprintf(stderr,"Font %s <%s> is resident.\n",
  171.                                      curfnt->name, p->PSname) ;
  172. #endif  /* DEBUG */
  173.    curfnt->resfont = p ;
  174.    curfnt->name = p->TeXname ;
  175.    for (i=0; i<256; i++) {
  176.       curfnt->chardesc[i].TFMwidth = 0 ;
  177.       curfnt->chardesc[i].packptr = NULL ;
  178.       curfnt->chardesc[i].pixelwidth = 0 ;
  179.       curfnt->chardesc[i].flags = 0 ;
  180.    }
  181.    add_name(p->PSname, &ps_fonts_used) ;
  182. /*
  183.  *   We include the font here.  But we only should need to include the
  184.  *   font if we have a stupid spooler; smart spoolers should be able
  185.  *   to supply it automatically.
  186.  */
  187.    if (p->downloadheader)
  188.       if (add_header(p->downloadheader)) {
  189.          swmem -= DNFONTCOST ;
  190.          fontmem -= DNFONTCOST ;
  191.       }
  192.    tfmload(curfnt) ;
  193.    usesPSfonts = 1 ;
  194.    return(1) ;
  195. }
  196. #define INLINE_SIZE (500)
  197. static char was_inline[INLINE_SIZE] ;
  198. void
  199. bad_config() {
  200.    extern void exit() ;
  201.  
  202.    error("Error in config file:") ;
  203.    (void)fputs(was_inline, stderr) ;
  204.    exit(1) ;
  205. }
  206. /*
  207.  *   Now we have the getdefaults routine.
  208.  */
  209. static char *psmapfile = PSMAPFILE ;
  210. void
  211. getdefaults(s)
  212. char *s ;
  213. {
  214.    FILE *deffile ;
  215.    char PSname[300] ;
  216.    register char *p ;
  217.    int i, j ;
  218.    char *d = configpath ;
  219.  
  220.    if (printer == NULL) {
  221.       if (s) {
  222.          strcpy(PSname, s) ;
  223.       } else {
  224.          d = "~" ;
  225.          strcpy(PSname, DVIPSRC) ;
  226.       }
  227.    } else {
  228.       strcpy(PSname, "config.") ;
  229.       strcat(PSname, printer) ;
  230.    }
  231.    if ((deffile=search(d,PSname,READ))!=NULL) {
  232.       while (fgets(was_inline, INLINE_SIZE, deffile)!=NULL) {
  233. /*
  234.  *   We need to get rid of the newline.
  235.  */
  236.        for (p=was_inline; *p; p++) ;
  237.        if (p > was_inline) *(p-1) = 0 ;
  238.        switch (was_inline[0]) {
  239. case 'm' :
  240. #ifdef SHORTINT
  241.          if (sscanf(was_inline+1, "%ld", &swmem) != 1) bad_config() ;
  242. #else   /* ~SHORTINT */
  243.          if (sscanf(was_inline+1, "%d", &swmem) != 1) bad_config() ;
  244. #endif  /* ~SHORTINT */
  245.          break ;
  246. case 'M' :
  247.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  248.          mfmode = newstring(PSname) ;
  249.          break ;
  250. case 'o' : case 'O' :
  251.          p = was_inline + 1 ;
  252. #ifdef VMS
  253.      p[strlen(p) - 1] = '\0';
  254. #endif /* VMS */
  255.          while (*p && *p <= ' ')
  256.             p++ ;
  257.          oname = newstring(p) ;
  258.          break ;
  259. #ifdef FONTLIB
  260. case 'L' : 
  261.          {
  262.             char tempname[300] ;
  263.             extern char *fliparse() ;
  264.             if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  265.             else {
  266.                flipath = newstring(fliparse(PSname,tempname));
  267.                fliname = newstring(tempname) ;
  268.             }
  269.      }
  270.          break ;
  271. #endif
  272. case 'T' : 
  273.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  274.          else tfmpath = newstring(PSname) ;
  275.          break ;
  276. case 'P' :
  277.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  278.          else pkpath = newstring(PSname) ;
  279.          break ;
  280. case 'p' :
  281.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  282.          else psmapfile = newstring(PSname) ;
  283.          break ;
  284. case 'V' : case 'v' :
  285.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  286.          else vfpath = newstring(PSname) ;
  287.          break ;
  288. case 'S' :
  289.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  290.          else figpath = newstring(PSname) ;
  291.          break ;
  292. case 's':
  293.          safetyenclose = 1 ;
  294.          break ;
  295. case 'H' : 
  296.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  297.          else headerpath = newstring(PSname) ;
  298.          break ;
  299. case 't' : 
  300.          if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ;
  301.          else paperfmt = newstring(PSname) ;
  302.          break ;
  303. case ' ' : case '*' : case '#' : case ';' : case '=' : case 0 : case '\n' :
  304.          break ;
  305. case 'r' :
  306.          reverse = (was_inline[1] != '0') ;
  307.          break ;
  308. /*
  309.  *   This case is for last resort font scaling; I hate this, but enough
  310.  *   people have in no uncertain terms demanded it that I'll go ahead and
  311.  *   add it.
  312.  *
  313.  *   This line must have numbers on it, resolutions, to search for the
  314.  *   font as a last resort, and then the font will be scaled.  These
  315.  *   resolutions should be in increasing order.
  316.  *
  317.  *   For most machines, just `30